package dialect

import (
	"fmt"
	"os"
	"strings"

	"code_gen/config"
)

var FileSaverMap = map[string]FileSaver{}

// FileSaver 文件保存器接口
type FileSaver interface {
	GenFile(ctx *Context, tf *config.TemplateFile, content string) error
}

// FileSaverMap 文件保存器

// DefaultFileSaver 默认文件保存器
var DefaultFileSaver = &CommonFileSaver{}

// CommonFileSaver 通用文件保存器
type CommonFileSaver struct{}

func (g *CommonFileSaver) GenFile(ctx *Context, tf *config.TemplateFile, content string) error {

	// 输出文件夹
	output := ctx.Tpl.Output
	if tf.Output != "" {
		output = tf.Output
	}

	// 输出文件名
	fileName := tf.Name
	fn := ctx.Get("fileName")
	if fn != nil && fn.(string) != "" {
		fileName = fn.(string)
	}

	if fileName == "" {
		return fmt.Errorf("文件名不能为空: %s", tf.Path)
	}

	// 确保文件夹存在
	_, err := os.Stat(output)
	if os.IsNotExist(err) {
		err = os.MkdirAll(output, os.ModePerm)
	}
	if err != nil {
		return err
	}

	// 输出文件
	outFile := fmt.Sprintf("%s%c%s.%s", output, os.PathSeparator, fileName, tf.Suffix)
	err = os.WriteFile(outFile, []byte(content), 0644)
	if err != nil {
		return err
	}

	return nil
}

// GetFileSaver 获取文件保存器
func GetFileSaver(lang string) FileSaver {

	saver, ok := FileSaverMap[lang]
	if ok {
		return saver
	}

	return DefaultFileSaver
}

// RegisterFileSaver 注册文件保存器
func RegisterFileSaver(lang string, saver FileSaver) {
	FileSaverMap[lang] = saver
}

// 获取包路径
func getPackagePath(ctx *Context, tf *config.TemplateFile) string {
	if tf.Package == "" {
		return ""
	}
	return strings.ReplaceAll(tf.Package, ".", string(os.PathSeparator))
}
